<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一个生成Promise对象的函数
        // msg延时之后传递的信息，time时间
        function timeout(msg,time){
            return new Promise((resolve,reject) =>{
                setTimeout(() =>{
                    resolve(msg);
                },time)
            })
        }

    //     function xiaoming(){
    //         timeout("小明2秒下楼",2000).then((result) =>{//这里的这个then后面也是一个函数
    //             console.log(result);
    //             return timeout("小明1秒到超市",1000);
    //         }).then((result) =>{
    //             console.log(result);
    //             return timeout("小明1秒买好了铅笔",1000)
    //     }).then((result) =>{
    //         console.log(result);
    //     })
    // }

    // xiaoming()



    // function* xiaoming1(){
    //     let result1 = yield timeout("小明2秒下楼",2000);
    //     console.log(result1);

    //     let result2= yield timeout("小明2秒去超市",2000);
    //     console.log(result2);
    // }

    // let it = xiaoming1();
    // // console.log(it.next());//{value: Promise, done: false}
    // let {value,done} = it.next();

    // value.then(result =>{
    //     // console.log(result);//"小明1秒下楼"
    //     it.next(result).value.then(result => it.next(result).value);//让then返回的promise的对象与value这个promise对象保持同步
    //     // 这里的value就是promise对象，也就是调用了timeout这个函数
    // })






    function* xiaoming1(){
        let result1 = yield timeout("小明2秒下楼",2000);
        console.log(result1);

        let result2= yield timeout("小明2秒去超市",2000);
        console.log(result2);
    }

     // 上述的过程可以封装通用的自动执行函数  
    //  作用是：能够自动的执行生成器函数中的promise
    // gen是一个生成器函数
    function run(gen){
        // it是生成器对象
        let it = gen();

        // 递归函数
        function step(result){
            // 规定value必须是一个promise对象
            let {value,done} = it.next(result);

            // 如果结束就直接返回
            if(done){
                return value;
            }

            // 没有结束就继续递归调用step函数
            value.then(result => step(result));

        }
        // 初次调用step启动函数
        step();
    }

    run(xiaoming1);

    // run(function* (){
    //     let result1 = yield timeout("1秒去吃饭",1000)
    //     console.log(result1);
    // })




    // function fn(){
    //     console.log(1)
    // }
    // fn()

    // function fn(){
    //     return 1
    // }
    // console.log(fn())
    </script>
</body>
</html>